package main

import (
	"context"
	"fmt"
	"log"
	"net"
	"os"
	"os/signal"
	"syscall"
	"time"

	"gitee.com/go-course/go12/vblog/conf"
	"gitee.com/go-course/go12/vblog/ioc"
	"gitee.com/go-course/go12/vblog/protocol"
	"google.golang.org/grpc"

	// 注册对象
	_ "gitee.com/go-course/go12/vblog/apps"
)

func main() {
	//1. 加载配置
	err := conf.LoadConfigFromToml("etc/application.toml")
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
	}

	//2. 初始化控制
	// 收到传递依赖关系：收到管理对象依赖
	// 2.1 user controller
	// userServiceImpl := userImpl.NewUserServiceImpl()
	// 2.2 token controller
	// tokenServiceImpl := tokenImpl.NewTokenServiceImpl(userServiceImpl)
	// ....
	//  通过Ioc来完成依赖的装载, 完成了依赖的倒置(ioc 依赖对象注册)
	if err := ioc.Controller().Init(); err != nil {
		fmt.Println(err)
		os.Exit(1)
	}

	// 初始化Api Handler
	if err := ioc.ApiHandler().Init(); err != nil {
		fmt.Println(err)
		os.Exit(1)
	}

	// 跑在后台的http server
	httpServer := protocol.NewHttpServer()
	go func() {
		if err := httpServer.Run(); err != nil {
			fmt.Printf("start http server error, %s\n", err)
		}
	}()

	// 启动一个跑Grpc Server的Goroutine
	grpcServer := grpc.NewServer()
	// 把controller内 所有实现了grpc服务的模块注册给grpc server
	ioc.Controller().GrpcSerivceRegistry(grpcServer)

	go func() {
		fmt.Println("gprc 服务访问地址: 127.0.0.1:1234")
		lis, err := net.Listen("tcp", ":1234")
		if err != nil {
			log.Fatal(err)
		}
		err = grpcServer.Serve(lis)
		if err != nil {
			fmt.Printf("start grpc server error, %s", err)
		}
	}()

	// 处理信号量
	ch := make(chan os.Signal, 1)
	signal.Notify(ch, syscall.SIGTERM, syscall.SIGINT, syscall.SIGHUP, syscall.SIGQUIT)

	// 等待信号的到来
	sn := <-ch
	fmt.Println(sn)

	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
	defer cancel()
	httpServer.Close(ctx)

	//
	fmt.Println("清理工作")
}
